home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / SMISC.C < prev    next >
C/C++ Source or Header  |  1989-09-07  |  5KB  |  257 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "proc.h"
  7. #include "remote.h"
  8. #include "smtp.h"
  9. #include "tcp.h"
  10. #ifdef    MSDOS
  11. #include "pc.h"
  12. #endif
  13. #ifdef    AMIGA
  14. #include "amiga.h"
  15. #endif
  16.  
  17. extern FILE *Logfp;
  18. extern int errno;
  19.  
  20. char *Rempass;    /* Remote access password */
  21.  
  22. static int chkrpass __ARGS((struct mbuf *bp));
  23. static void discserv __ARGS((int s,void *unused,void *p));
  24. static void echoserv __ARGS((int s,void *unused,void *p));
  25.  
  26. static int Rem = -1;
  27. static int Sdisc = -1;
  28. static int Secho = -1;
  29.  
  30. /* Start up TCP discard server */
  31. int
  32. dis1(argc,argv,p)
  33. int argc;
  34. char *argv[];
  35. void *p;
  36. {
  37.     struct sockaddr_in lsocket;
  38.     int s;
  39.  
  40.     if(Sdisc != -1){
  41.         freeargs(argc,argv);
  42.         return 0;
  43.     }
  44.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  45.     chname(Curproc,"Discard listener");
  46.  
  47.     lsocket.sin_family = AF_INET;
  48.     lsocket.sin_addr.s_addr = Ip_addr;
  49.     if(argc < 2)
  50.         lsocket.sin_port = IPPORT_DISCARD;
  51.     else
  52.         lsocket.sin_port = atoi(argv[1]);
  53.     freeargs(argc,argv);
  54.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  55.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  56.     listen(Sdisc,1);
  57.     for(;;){
  58.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  59.             break;    /* Service is shutting down */
  60.  
  61.         /* Spawn a server */
  62.         newproc("Discard server",576,discserv,s,NULL,NULL);
  63.     }
  64.     return 0;
  65. }
  66. static void
  67. discserv(s,unused,p)
  68. int s;
  69. void *unused;
  70. void *p;
  71. {
  72.     struct mbuf *bp;
  73.  
  74.     sockowner(s,Curproc);
  75.     log(s,"open discard");
  76.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  77.         free_p(bp);
  78.     log(s,"close discard");
  79.     close_s(s);
  80. }
  81. /* Stop discard server */
  82. int
  83. dis0(argc,argv,p)
  84. int argc;
  85. char *argv[];
  86. void *p;
  87. {
  88.     close_s(Sdisc);
  89.     Sdisc = -1;
  90.     return 0;
  91. }
  92. /* Start up TCP echo server */
  93. int
  94. echo1(argc,argv,p)
  95. int argc;
  96. char *argv[];
  97. void *p;
  98. {
  99.     struct sockaddr_in lsocket;
  100.     int s;
  101.  
  102.     if(Secho != -1){
  103.         freeargs(argc,argv);
  104.         return 0;
  105.     }
  106.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  107.     chname(Curproc,"Echo listener");
  108.  
  109.     lsocket.sin_family = AF_INET;
  110.     lsocket.sin_addr.s_addr = Ip_addr;
  111.     if(argc < 2)
  112.         lsocket.sin_port = IPPORT_ECHO;
  113.     else
  114.         lsocket.sin_port = atoi(argv[1]);
  115.     freeargs(argc,argv);
  116.     Secho = socket(AF_INET,SOCK_STREAM,0);
  117.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  118.     listen(Secho,1);
  119.     for(;;){
  120.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  121.             break;    /* Service is shutting down */
  122.  
  123.         /* Spawn a server */
  124.         newproc("Echo server",2048,echoserv,s,NULL,NULL);
  125.     }
  126.     return 0;
  127. }
  128. static void
  129. echoserv(s,unused,p)
  130. int s;
  131. void *unused;
  132. void *p;
  133. {
  134.     struct mbuf *bp;
  135.  
  136.     sockowner(s,Curproc);
  137.     log(s,"open echo");
  138.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  139.         send_mbuf(s,bp,0,NULLCHAR,0);
  140.  
  141.     log(s,"close echo");
  142.     close_s(s);
  143. }
  144. /* stop echo server */
  145. int
  146. echo0(argc,argv,p)
  147. int argc;
  148. char *argv[];
  149. void *p;
  150. {
  151.     close_s(Secho);
  152.     Secho = -1;
  153.     return 0;
  154. }
  155. /* Start remote exit/reboot server */
  156. int
  157. rem1(argc,argv,p)
  158. int argc;
  159. char *argv[];
  160. void *p;
  161. {
  162.     struct sockaddr_in lsocket,fsock;
  163.     int i;
  164.     char command;
  165.     struct mbuf *bp;
  166.     int32 addr;
  167.  
  168.     if(Rem != -1){
  169.         freeargs(argc,argv);
  170.         return 0;
  171.     }
  172.     psignal(Curproc,0);
  173.     chname(Curproc,"Remote listener");
  174.     lsocket.sin_family = AF_INET;
  175.     lsocket.sin_addr.s_addr = Ip_addr;
  176.     if(argc < 2)
  177.         lsocket.sin_port = IPPORT_REMOTE;
  178.     else
  179.         lsocket.sin_port = atoi(argv[1]);
  180.     
  181.     freeargs(argc,argv);
  182.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  183.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  184.     for(;;){
  185.         i = sizeof(fsock);
  186.         if(recv_mbuf(Rem,&bp,0,0,(char *)&fsock,&i) == -1)
  187.             break;
  188.         command = pullchar(&bp);
  189.  
  190.         switch(uchar(command)){
  191. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  192.         case SYS_RESET:
  193.             i = chkrpass(bp);
  194.             log(Rem,"%s - Remote reset %s",
  195.              psocket((struct sockaddr *)&fsock),
  196.              i == 0 ? "PASSWORD FAIL" : "" );
  197.             if(i != 0){
  198.                 iostop();
  199.                 sysreset();    /* No return */
  200.             }
  201.             break;
  202. #endif
  203.         case SYS_EXIT:
  204.             i = chkrpass(bp);
  205.             log(Rem,"%s - Remote exit %s",
  206.              psocket((struct sockaddr *)&fsock),
  207.              i == 0 ? "PASSWORD FAIL" : "" );
  208.             if(i != 0){
  209.                 iostop();
  210.                 exit(0);
  211.             }
  212.             break;
  213.         case KICK_ME:
  214.             if(len_mbuf(bp) >= sizeof(int32))
  215.                 addr = pull32(&bp);
  216.             else
  217.                 addr = fsock.sin_addr.s_addr;
  218.             kick(addr);
  219.             smtptick((void *)addr);
  220.             break;
  221.         }
  222.         free_p(bp);
  223.     }
  224.     close_s(Rem);
  225.     Rem = -1;
  226.     return 0;
  227. }
  228. /* Check remote password */
  229. static int
  230. chkrpass(bp)
  231. struct mbuf *bp;
  232. {
  233.     char *lbuf;
  234.     int16 len;
  235.     int rval = 0;
  236.  
  237.     len = len_mbuf(bp);
  238.     if(strlen(Rempass) != len)
  239.         return rval;
  240.     lbuf = malloc(len);
  241.     pullup(&bp,lbuf,len);
  242.     if(strncmp(Rempass,lbuf,len) == 0)
  243.         rval = 1;
  244.     free(lbuf);
  245.     return rval;
  246. }
  247. int
  248. rem0(argc,argv,p)
  249. int argc;
  250. char *argv[];
  251. void *p;
  252. {
  253.     close_s(Rem);
  254.     return 0;
  255. }
  256.  
  257.